/* 
事件传播机制：
作用：在事件发生的时候确定由谁来消费；
潜在消费者：e.path数组 [span,div,body,html,document,window]
过程：
+ 确定传播方向：element.addEventListener("click",handler,true/false)//true=捕获,false=冒泡
+ 设置事件监听器：span.addEventListener(xxoo),body.addEventListener(xxoo),document.addEventListener(xxoo)
+ 适时中断传播：e.stopPropagation() 或者使用其备胎API：e.cancelBubble = false
*/

/* 手封MyMap */
class MyMap {
    constructor(){
        this.obj = {}
        this.updateSize()
    }

    updateSize(){
        this.size = Object.keys(this.obj).length
    }

    set(key,value){
        this.obj[key] = value
        this.updateSize()
    }

    get(key){
        return this.obj[key]
    }

    has(key){
        return this.obj.hasOwnProperty(key)
    }

    delete(key){
        delete this.obj[key]
        this.updateSize()
    }

    clear(){
        this.obj = {}
        this.updateSize()
    }

    /* 
    mmp.forEach(
        function(value,key,map){
            //this.updateSize()
        }
    )
    */
    forEach(handler){
        for(let key in this.obj){
            handler.apply(this,[this.obj[key],key,this])
        }
    }

    keys(){
        return Object.keys(this.obj)
    }

    values(){
        return Object.keys(this.obj).map(key=>this.obj[key])
    }

    entries(){
        return Object.keys(this.obj).map(key=>({key,value:this.obj[key]}))
    }
}

/* 成绩闭包 */
function fn3(){
    function score(name){
        // 私有数据
        const obj = {}

        // 返回私有数据的操作API
        return {
            set(key,value){
                obj[key]=value
            },
            getAll(){
                return obj
            }
        }
    }
    const stus = ["张三","李四","王五"]
    const scoreObj = {}

    // 做出全班学生的闭包操作API对象
    stus.forEach(
        name => scoreObj[name] = score(name)
    )

    let name = "李四",key="语文",value=50

    // 设置任意学生的任意成绩
    scoreObj[name].set(key,50)
    scoreObj[name].set("数学",60)

    // 查询任意学生的全部成绩
    console.log(
        JSON.stringify(scoreObj[name].getAll())
    );
}
// fn3()

